package com.xlh.service.course;

import com.xlh.dto.course.*;
import com.xlh.dto.user.UserInfoDTO;
import com.xlh.enums.ResourceRelationTypeEnum;
import com.xlh.enums.ResourcesTypeEnum;
import com.xlh.enums.course.CourseSharedEnum;
import com.xlh.enums.course.CourseStatusEnum;
import com.xlh.enums.course.UserCourseStatusEnum;
import com.xlh.param.course.CourseParam;
import com.xlh.param.course.CreateOrUpdateCourseSortParam;
import com.xlh.param.course.CreateResourceParam;
import com.xlh.param.course.FileParam;
import com.xlh.pojo.course.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 课程
 * <p>
 * Created by lx on 2019/1/28.
 */
public interface CourseService {

    /**
     * 根据课程id获取课程基本信息
     *
     * @param courseId 课程id
     * @return
     */
    CourseBasicDTO getCourse(Long courseId);

    /**
     * 获取课程信息
     *
     * @param courseIds 课程id集合
     * @param ownCourse 是否是自己的课程
     * @param preseted  是否预置
     * @param status    课程状态
     * @return
     */
    List<CourseBasicDTO> listCourse(List<Long> courseIds, Boolean ownCourse, Boolean preseted, Integer status);

    /**
     * 获取课程信息
     *
     * @param courseIds      班级id集合
     * @param ownCourse      是否是自己的课程
     * @param preseted       是否预置
     * @param status         课程状态
     * @param names          名称集合
     * @param courseBasicIds 课程基本id集合
     * @return
     */
    List<CourseBasicDTO> listCourse(
            List<Long> courseIds, Boolean ownCourse, Boolean preseted, Integer status,
            List<String> names, List<Long> courseBasicIds);

    /**
     * 获取课程信息
     *
     * @param statusList 课程状态集合
     * @param preseted   是否预置
     * @param ownCourse  是否是自己的课程
     * @param userIds    教师id集合
     * @param courseIds  课程id集合
     * @return
     */
    List<CourseDTO> listCourse(List<Integer> statusList, Boolean preseted, Boolean ownCourse,
                               List<Long> userIds, List<Long> courseIds);

    /**
     * 根据课程id获取课程信息
     *
     * @param courseId 课程id
     * @return
     */
    Course getCourseById(Long courseId);

    /**
     * 根据课程id获取教师信息
     *
     * @param courseId 课程id
     * @param classId  班级id
     * @return
     */
    List<UserInfoDTO> getCourseTeachers(Long courseId, Long classId);

    /**
     * 根据课程id获取教师id的集合
     *
     * @param courseId 课程id 必须传
     * @param classId  班级id
     * @return
     */
    List<Long> getCourseTeacherIds(Long courseId, Long classId);

    /**
     * 获取课程列表
     *
     * @param coursePageSize     课程按照多少条数分页
     * @param skillPageSize      岗位分页数量
     * @param casePageSize       案例分页数量
     * @param technologyPageSize 技能分页数量
     * @return
     */
    CourseIndexDTO getCourseIndex(
            Integer coursePageSize, Integer skillPageSize, Integer casePageSize, Integer technologyPageSize);

    /**
     * 获取课程体系首页数据
     *
     * @param coursePageSize 课程按照多少条数分页
     * @param directionId    专业方向id
     * @return
     */
    CourseIndexDataDTO getCourseDirectionIndex(Integer coursePageSize, Long directionId);

    /**
     * 创建课程
     *
     * @param param 创建的参数
     */
    Long createCourse(CourseParam param);

    /**
     * 创建课程
     *
     * @param courseBasic 课程基本参数
     * @param course      课程
     * @return
     */
    Long createCourse(CourseBasic courseBasic, Course course);

    /**
     * 从其他教师或者管理员的课程复制一下 创作的课程
     *
     * @param courseId 课程id
     * @param userId   用户id
     * @return
     */
    Long createCourse(Long courseId, Long userId);

    /**
     * 修改课程
     *
     * @param courseId 课程id
     * @param param    修改参数
     */
    void updateCourse(Long courseId, CourseParam param);

    /**
     * 修改课程信息
     *
     * @param courseBasic 课程基本信息
     */
    void updateCourse(CourseBasic courseBasic);

    /**
     * 修改课程资源
     *
     * @param courseBasicId 课程基本id
     * @param resourceId    资源id
     */
    void updateCourseBasicResource(Long courseBasicId, Long resourceId);

    /**
     * 修改课程状态
     *
     * @param courseId 课程id
     */
    void updateCourseStatus(Long courseId, CourseStatusEnum statusEnum);

    /**
     * 批量删除课程
     *
     * @param courseIds      课程id集合
     * @param errorDealFlag  错误标识处理 true：删除  null：无报错信息
     * @param logicDeleted   是否逻辑删除 true：逻辑删除（假删除） false：真删除
     * @param updatePreseted 是否修改为预置课程 true：修改 false：不修改
     */
    void deleteBatchCourse(List<Long> courseIds, Boolean errorDealFlag, Boolean logicDeleted, Boolean updatePreseted);

    /**
     * 根据课程展示状态，获取所有课程的下拉列表
     *
     * @param courseSharedEnum 课程预置枚举
     * @return
     */
    List<CourseDTO> listCourse(CourseSharedEnum courseSharedEnum);

    /**
     * 根据课程id，获取所有教师需要引用这门课程的信息
     *
     * @param courseIds 课程id集合
     * @return
     */
    List<Course> queryCourses(List<Long> courseIds);

    /**
     * 获取创作课程的数据
     *
     * @return
     */
    List<CourseDTO> queryCourseList();

    /**
     * 检查并获取文件地址
     *
     * @param type  资源类型
     * @param param 参数
     * @return
     */
    String checkAndGetFilePath(Integer type, FileParam param);

    /**
     * 获取课程信息
     *
     * @param courseIds 课程id集合
     * @return
     */
    List<CourseDTO> getCourseInfo(List<Long> courseIds);

    /**
     * 查询已存在的课程id
     *
     * @param courseBasicId 课程基本id
     * @param userId        用户id
     * @return
     */
    Long queryExistCourseId(Long courseBasicId, Long userId);

    /**
     * 检查删除参数并获取课程
     *
     * @param courseIds     课程id集合
     * @param errorDealFlag 错误处理标识 null：用户未做处理  true：进行删除
     * @return
     */
    List<Long> checkDeleteParamAndGet(List<Long> courseIds, Boolean errorDealFlag);

    /**
     * 获取某课程下的用户状态
     *
     * @param id 课程id
     * @return
     */
    UserCourseStatusEnum queryUserCourseStatus(Long id);

    /**
     * 获取用户导航
     *
     * @param id 课程id
     * @return
     */
    List<CourseNavigationDTO> getUserNavigation(Long id);

    /**
     * 获取学生是否考试
     *
     * @param courseIds 课程id集合
     * @return key：课程id  value：是否考试
     */
    Map<Long, Boolean> getStudentIsTesting(List<Long> courseIds);

    /**
     * 创建或修改预置资源
     *
     * @param id 课程id
     */
    void createOrUpdatePresetResource(Long id);

    /**
     * 获取教师自己创作、关联的课程以及其他教师发布课程、预置课程
     *
     * @return
     */
    List<CourseIndexInfoDTO> getIndexData();

    /**
     * 教师所教授的课程
     *
     * @param userId 教师id
     * @return
     */
    List<CourseDTO> queryTeacherCourse(Long userId);

    /**
     * 获取学生班级的课程
     *
     * @param classIds 学生的班级id集合
     * @return
     */
    List<CourseDTO> listRelationCourseForStudent(List<Long> classIds);

    /**
     * 获取课程
     *
     * @param userId   教师id
     * @param courseId 课程id
     * @return
     */
    List<CourseDTO> queryCourses(Long userId, Long courseId);

    /**
     * 获取课程的辅助教师集合
     *
     * @param courseIds 课程id集合
     * @param userId    教师id
     * @param classId   班级id
     * @return
     */
    List<CourseTeacher> queryCourseTeacher(List<Long> courseIds, Long userId, Long classId);

    /**
     * 删除助教的关联关系
     *
     * @param courseId 课程id
     * @param classIds 班级id集合
     */
    void deleteCourseTeachers(Long courseId, List<Long> classIds);

    /**
     * 删除助教
     *
     * @param userIds 教师id集合
     */
    void deleteCourseTeachers(List<Long> userIds);

    /**
     * 查询助教在其他课程下的集合
     *
     * @param courseId 课程id
     * @param userId   教师id
     */
    Boolean queryCourseTeachers(Long courseId, Long userId);

    /**
     * 获取课程分类
     *
     * @param courseIds 课程id集合
     * @return
     */
    List<CourseSort> queryCourseSort(List<Long> courseIds);

    /**
     * 创建或修改课程分类
     *
     * @param courseId 课程id
     * @param params   参数
     */
    void createOrUpdateCourseSort(Long courseId, List<CreateOrUpdateCourseSortParam> params);

    /**
     * 删除课程分类
     *
     * @param courseSortIds 课程分类id集合
     * @param courseIds     课程id集合
     */
    void deleteCourseSort(List<Long> courseSortIds, List<Long> courseIds);

    /**
     * 批量插入课程分类
     *
     * @param data 插入的数据
     */
    void insertBatchCourseSort(List<CourseSort> data);

    /**
     * 添加或修改资源
     *
     * @param id                课程id
     * @param resourcesTypeEnum 资源类型枚举
     * @param param             参数
     */
    void createOrUpdateResource(Long id, ResourcesTypeEnum resourcesTypeEnum, CreateResourceParam param);

    /**
     * 获取课程资源
     *
     * @param id                 课程id
     * @param resourcesTypeEnums 资源类型枚举集合
     * @return
     */
    Map<String, ResourceInfoDTO> queryResource(Long id, List<ResourcesTypeEnum> resourcesTypeEnums);

    /**
     * 读内容
     *
     * @param resourceDTOS 资源
     * @param typeEnum     类型枚举
     * @return
     */
    List<ResourceDTO> readContent(List<ResourceDTO> resourceDTOS, ResourcesTypeEnum typeEnum);

    /**
     * 删除课程资源
     *
     * @param ids               课程id集合
     * @param resourcesTypeEnum 资源类型枚举集合
     * @param typeEnum          资源关联关系枚举
     * @param deleteResource    删除资源
     * @return
     */
    List<String> deleteCourseResource(
            List<Long> ids, List<ResourcesTypeEnum> resourcesTypeEnum,
            ResourceRelationTypeEnum typeEnum, boolean deleteResource);

    /**
     * 技能表入库
     *
     * @param list
     */
    String insertSkill(List<SkillDTO> list, Integer skillId, MultipartFile file, Integer role);

    /**
     * 查询技能
     *
     * @param id
     * @return
     */
    List<SkillNotes> querySkill(Integer id);

    /**
     * 查询技能课程信息
     *
     * @return
     */
    List<SkillNotes> querySkillCourse();

    /**
     * 查询技能
     *
     * @param id
     * @return
     */
    void saveOrUpdateSkill(List<SkillNotes> skillid);

    /**
     * 查询技能
     *
     * @param id
     * @return
     */
    void updateSkill(Integer id, String name);

    /**
     * 管理员添加技能点
     *
     * @param id
     * @return
     */
    void insertOther(String iconValue, String name);

    /**
     * 管理员删除技能点
     *
     * @param id
     * @return
     */
    void deleteSkill(Integer skillid);

    /**
     * 查询技能课程信息
     *
     * @return
     */
    Map<String, List<SkillNotes>> querySkillOther(Integer id);
}
